﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MIAP.DataAccess.Interfaces;
using MIAP.Entidades;

namespace MIAP.Negocio
{
    /// <summary>
    /// Clase de negocio de la vista Consulta Cargas y Ejecución de Proyecto.
    /// </summary>
    public class ConsultaCargasEjecucionNegocio
    {
        #region Campos

        /// <summary>
        /// Instancia para el acceso a datos de usuarios.
        /// </summary>
        private readonly IUsuarioDao daoUsuario;

        /// <summary>
        /// Instancia para el acceso a datos de Consulta Cargas Ejecucion Proyecto Negocio.
        /// </summary>
        private readonly IConsultaCargasEjecucionProyectoDao daoConsultaCargaEjecucion;

        /// <summary>
        /// Instancia para las operaciones de negocio comunes a la aplicación.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        #endregion

        #region Constructor

        public ConsultaCargasEjecucionNegocio()
        {
            this.daoUsuario = DataAccessFactory.Instance.CreateUsuariosDao();
            this.daoConsultaCargaEjecucion = DataAccessFactory.Instance.CreateConsultaCargasEjecucionProyectoDao();
            this.comunesNegocio = new ComunesNegocio();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Obtiene todos los usuarios.
        /// </summary>
        /// <returns></returns>F
        public List<UsuarioInfo> GetUsuarios()
        {
            return this.daoUsuario.GetUsuarios().ToList();
        }

        /// <summary>
        /// Obtiene los tipos de proceso relacionados con las cargas y recargas de archivos y ejecución y reejecución de proyectos. 
        /// </summary>
        /// <returns></returns>
        public List<CatalogoInfo> GetTipoProceso()
        {
            return this.daoConsultaCargaEjecucion.GetTipoProceso().ToList();
        }

        /// <summary>
        /// Obtiene todas las cargas, recargas de un archivo.
        /// </summary>
        /// <param name="consultaCargaFilters">Filtros.</param>
        /// <returns>Lista de los archivos con cargas y recargas de acuerdo a los filtros.</returns>
        public List<ConsultaCargaEjecucionInfo> GetCargasArchivos(ConsultaCargaEjecucionInfo consultaCargaFilters)
        {
            List<ConsultaCargaEjecucionInfo> listCargasRealizadas;

            listCargasRealizadas = this.daoConsultaCargaEjecucion.GetCargasArchivos(consultaCargaFilters).ToList();

            List<EjecutorInfo> listArchivosCarga = new List<EjecutorInfo>();

            foreach (ConsultaCargaEjecucionInfo archivo in listCargasRealizadas)
            {
                listArchivosCarga.Add(new EjecutorInfo { IdCargaArchivo = archivo.IdCargaArchivo, IdBitacora = archivo.IdBitacora, VersionArchivo = archivo.Version });
            }

            if (listArchivosCarga.Count != default(int))
            {
                // Obtener los autorizadores.
                List<EjecutorInfo> listAutorizadores = this.daoConsultaCargaEjecucion.GetAutorizadorArchivos(listArchivosCarga).ToList();

                foreach (EjecutorInfo autorizador in listAutorizadores)
                {
                    listCargasRealizadas.Where(p => p.IdCargaArchivo == autorizador.IdCargaArchivo && p.IdBitacora == autorizador.IdBitacora && p.Version == autorizador.VersionArchivo).Single().Autorizador = autorizador.NombreEjecutor;
                }
            }

            this.GetVersionadores(listCargasRealizadas);

            return listCargasRealizadas;
        }
     
        /// <summary>
        /// Obtiene las ejecuciones y reejecuciones de un proyecto.
        /// </summary>
        /// <param name="consultaCargaFilters">Filtros.</param>
        /// <returns>Lista de los proyectos ejecutados y reejecutados de acuerdo a los filtros.</returns>
        public List<ConsultaCargaEjecucionInfo> GetEjecucionProyectos(ConsultaCargaEjecucionInfo consultaCargaFilters)
        {
            List<ConsultaCargaEjecucionInfo> listProyectosEjecutados;

            listProyectosEjecutados = this.daoConsultaCargaEjecucion.GetEjecucionProyectos(consultaCargaFilters).ToList();
            
            List<EjecutorInfo> listProyectos = new List<EjecutorInfo>();

            foreach (ConsultaCargaEjecucionInfo proyecto in listProyectosEjecutados)
            {
                listProyectos.Add(new EjecutorInfo { IdBitacoraProyecto = proyecto.IdBitacoraProyecto, IdBitacora = proyecto.IdBitacora });
            }

            if (listProyectos.Count != default(int))
            {
                // Obtener los autorizadores.
                List<EjecutorInfo> listAutorizadores = this.daoConsultaCargaEjecucion.GetAutorizadorProyectos(listProyectos).ToList();

                foreach (EjecutorInfo autorizador in listAutorizadores)
                {
                    listProyectosEjecutados.Where(p => p.IdBitacoraProyecto == autorizador.IdBitacoraProyecto && p.IdBitacora == autorizador.IdBitacora).Single().Autorizador = autorizador.NombreEjecutor;
                }
            }

            this.GetVersionadores(listProyectosEjecutados);

            return listProyectosEjecutados;
        }

        /// <summary>
        /// Obtiene los versionadores de archivos y proyectos.
        /// </summary>
        /// <param name="listCargasRealizadas">Lista de archivos o proyectos.</param>
        private void GetVersionadores(List<ConsultaCargaEjecucionInfo> listCargasRealizadas)
        {
            List<EjecutorInfo> listArchivos = new List<EjecutorInfo>();

            foreach (ConsultaCargaEjecucionInfo archivo in listCargasRealizadas)
            {
                listArchivos.Add(new EjecutorInfo { IdBitacora = archivo.IdBitacora });
            }

            // Obtener los versionadores.
            List<EjecutorInfo> listVersionadores = this.daoConsultaCargaEjecucion.GetNombreVersionador(listArchivos).ToList();

            foreach (EjecutorInfo versionador in listVersionadores)
            {
                listCargasRealizadas.Where(p => p.IdBitacora == versionador.IdBitacora).Single().NombreEjecutorCarga = versionador.NombreEjecutor;
            }
        }

        #endregion
    }
}
